import requests
import time
import csv
from bs4 import BeautifulSoup
from fake_useragent import UserAgent


class JiangsuGaokaoScoreCrawler:
    def __init__(self):
        # 初始化UA池
        self.ua = UserAgent()
        self.headers = {
            'User-Agent': self.ua.random,
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6',
            'Connection': 'keep-alive'
        }
        # 存储结果
        self.results = []

    def get_page_content(self, url):
        """获取页面内容"""
        try:
            response = requests.get(url, headers=self.headers, timeout=10)
            response.encoding = response.apparent_encoding  # 自动识别编码
            if response.status_code == 200:
                return response.text
            else:
                print(f"请求失败，状态码: {response.status_code}")
                return None
        except Exception as e:
            print(f"请求出错: {str(e)}")
            return None

    def extract_admission_info(self,html):
        """
        提取HTML中的录取信息（省份、专业、分数等）
        参数: html_content - 包含录取信息的HTML内容
        返回: 提取的信息列表，每个元素为包含详细信息的字典
        """
        soup = BeautifulSoup(html, 'html.parser')

        # 定位所有表格行（每一行对应一条录取信息）
        rows = soup.find_all('tr')

        for row in rows:
            # 获取当前行的所有单元格
            cells = row.find_all('td')
            if len(cells) >= 4:  # 确保单元格数量足够（至少包含省份、专业、两个分数）
                # 提取每个单元格中的文本（从span标签中获取）
                province = cells[0].find('span').get_text(strip=True) if cells[0].find('span') else ''
                major = cells[1].find('span').get_text(strip=True) if cells[1].find('span') else ''
                score1 = cells[2].find('span').get_text(strip=True) if cells[2].find('span') else ''
                score2 = cells[3].find('span').get_text(strip=True) if cells[3].find('span') else ''

                # 整理为字典并添加到结果列表
                self.results.append({
                    '省份': province,
                    '专业': major,
                    '分数1': score1,
                    '分数2': score2  # 可根据实际含义重命名（如"最高分"、"最低分"）
                })

        return self.results

    def save_to_csv(self, filename='2025江苏高考大学分数线.csv'):
        """将结果保存为CSV文件"""
        if not self.results:
            print("没有数据可保存")
            return

        with open(filename, 'w', newline='', encoding='utf-8-sig') as f:
            # 获取所有字段名
            fieldnames = self.results[0].keys()
            writer = csv.DictWriter(f, fieldnames=fieldnames)

            writer.writeheader()
            for item in self.results:
                writer.writerow(item)

        print(f"数据已保存到 {filename}，共 {len(self.results)} 条记录")

    def run(self, start_url):
        """运行爬虫程序"""
        print("开始爬取2025年江苏省高考各大学分数线...")
        html = self.get_page_content(start_url)

        #print(html)

        if html:
            self.extract_admission_info(html)
            self.save_to_csv()
        else:
            print("无法获取页面内容，爬取失败")

        print("爬取结束")


if __name__ == "__main__":
    # 注意：请替换为实际发布2025年江苏高考分数线的官方网站URL
    # 示例URL，非真实有效地址
    target_url = "https://zsb.seu.edu.cn/2025/0407/c23657a524104/page.htm"

    crawler = JiangsuGaokaoScoreCrawler()
    crawler.run(target_url)

    # 礼貌爬取，设置适当延迟
    time.sleep(1)
